#ifndef INFRASTRUCTURE_VEHICLE_MKLM_SERVER_MANAGER_H
#define INFRASTRUCTURE_VEHICLE_MKLM_SERVER_MANAGER_H

#include "kernel/interfaces/ILogger.h"
#include "kernel/dtos/agv_dto.h"
#include "kernel/agv/agv_entity.h"
#include "infrastructure/io/tcp_socket_server.h"
#include "infrastructure/io/tcp_socket_client.h"
#include "infrastructure/vehicle/robokit_api/RobProtocol.h"
#include <QObject>
#include <memory>
#include <unordered_map>
#include <unordered_set>
#include <functional>

namespace infrastructure {
namespace vehicle {
namespace mklm {

/**
 * @brief MKLM 服务器管理器（单例）
 * @details 管理一个共享的 TCP Server，所有 MKLM AGV 连接到同一端口
 *          根据数据中的 agv_num 字段分发到对应的回调
 */
class MklmServerManager : public QObject {
    Q_OBJECT

public:
    using StatusUpdateCallback = std::function<void(const kernel::dtos::MklmAgvStatusDTO&)>;

    /**
     * @brief 获取单例实例
     */
    static MklmServerManager* instance();

    /**
     * @brief 初始化服务器（只需调用一次）
     * @param listenPort 监听端口
     * @param logger 日志器
     * @return bool 是否成功
     */
    bool initialize(quint16 listenPort, std::shared_ptr<kernel::ILogger> logger);

    /**
     * @brief 注册 AGV 的状态回调
     * @param agvNumber AGV 编号
     * @param callback 状态更新回调
     */
    void registerAgvCallback(int agvNumber, StatusUpdateCallback callback);

    /**
     * @brief 注销 AGV 回调
     * @param agvNumber AGV 编号
     */
    void unregisterAgvCallback(int agvNumber);

    /**
     * @brief 检查服务器是否正在运行
     */
    bool isRunning() const { return m_isRunning; }

    /**
     * @brief 获取监听端口
     */
    quint16 getListenPort() const { return m_listenPort; }

    /**
     * @brief 停止服务器
     */
    void shutdown();

    /**
     * @brief 获取AGV的IP地址（从被动连接中提取）
     * @param agvNumber AGV编号
     * @return QString IP地址，如果未找到返回空字符串
     */
    QString getAgvIpAddress(int agvNumber) const;

signals:
    /**
     * @brief 检测到未注册的MKLM AGV信号
     * @param agvNumber AGV编号
     * @param status 初始状态数据
     */
    void unknownMklmAgvDetected(int agvNumber, kernel::dtos::MklmAgvStatusDTO status);

private:
    explicit MklmServerManager(QObject* parent = nullptr);
    ~MklmServerManager() override;

    // 禁止拷贝
    MklmServerManager(const MklmServerManager&) = delete;
    MklmServerManager& operator=(const MklmServerManager&) = delete;

private slots:
    /**
     * @brief 处理新客户端连接
     */
    void onClientConnected(qint64 socketDescriptor, const QString& ip, quint16 port);

    /**
     * @brief 处理客户端断开连接
     */
    void onClientDisconnected(qint64 socketDescriptor, const QString& ip, quint16 port);

private:
    static MklmServerManager* s_instance;

    quint16 m_listenPort{0};
    std::shared_ptr<kernel::ILogger> m_logger;
    bool m_isRunning{false};

    std::unique_ptr<io::TcpSocketServer> m_server;

    // 连接描述符 -> 协议解析器
    std::unordered_map<qint64, robokit::RProtocol*> m_protocols;

    // AGV编号 -> 状态回调
    std::unordered_map<int, StatusUpdateCallback> m_agvCallbacks;

    // 已知的MKLM车辆编号集合（用于检测新AGV）
    std::unordered_set<int> m_knownMklmAgvs;

    // AGV编号 -> socket descriptor 映射（用于获取IP地址）
    std::unordered_map<int, qint64> m_agvSocketMap;

    /**
     * @brief 协议数据接收回调
     * @param cmdType 命令类型
     * @param data 数据
     * @param socketDescriptor 连接描述符
     */
    void onProtocolDataReceived(uint16_t cmdType, QByteArray& data, qint64 socketDescriptor);

    /**
     * @brief 解析并分发状态数据
     * @param jsonObj JSON对象
     * @param socketDescriptor 连接描述符
     */
    void parseAndDispatchStatus(const QJsonObject& jsonObj, qint64 socketDescriptor);

    // Robokit 协议命令类型
    static constexpr uint16_t CMD_STATUS_UPLOAD = 2002;
};

} // namespace mklm
} // namespace vehicle
} // namespace infrastructure

#endif // INFRASTRUCTURE_VEHICLE_MKLM_SERVER_MANAGER_H
